package com.piece.core.db.util;

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.io.File;
import java.util.Arrays;

public class ScrewUtil {

    public static final String DOC_FILE_NAME = "数据库文档";
    public static final String DOC_VERSION = "1.0.0";
    public static final String DOC_DESCRIPTION = "文档描述";

    /**
     * 创建数据源
     */
    public static HikariDataSource buildDataSource(String driveClass, String url, String username, String password) {
        // 创建 HikariConfig 配置类
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        // 设置可以获取 tables remarks 信息
        hikariConfig.addDataSourceProperty("useInformationSchema", "true");
        // 设置中文字符集
        hikariConfig.addDataSourceProperty("useUnicode", "true");
        hikariConfig.addDataSourceProperty("characterEncoding", "utf8");
        // 创建数据源
        return new HikariDataSource(hikariConfig);
    }

    /**
     * 创建 screw 的引擎配置
     */
    public static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String filePath, String fileName) {
        return EngineConfig.builder()
                .fileOutputDir(filePath) // 生成文件路径
                .openOutputDir(false) // 打开目录
                .fileType(fileOutputType) // 文件类型
                .produceType(EngineTemplateType.velocity) // 文件类型
                .fileName(fileName) // 自定义文件名称
                .build();
    }

    /**
     * 创建 screw 的处理配置
     */
    public static ProcessConfig buildProcessConfig(String... ignorePrefix) {
        return ProcessConfig.builder()
                .ignoreTablePrefix(Arrays.asList(ignorePrefix)) // 忽略表前缀
                .build();
    }

    /**
     * 生成文档文件
     */
    public static String doExecute(HikariDataSource dataSource, EngineFileType fileOutputType, String filePath, String fileName) {
        // 创建 screw 的配置
        Configuration config = Configuration.builder()
                .version(DOC_VERSION)  // 版本
                .description(DOC_DESCRIPTION) // 描述
                .dataSource(dataSource) // 数据源
                .engineConfig(buildEngineConfig(fileOutputType, filePath, fileName)) // 引擎配置
                .produceConfig(buildProcessConfig()) // 处理配置
                .build();

        // 执行 screw，生成数据库文档
        new DocumentationExecute(config).execute();
        return filePath + File.separator + fileName + fileOutputType.getFileSuffix();
    }
}
